package com.xiongwei.thread;

import java.util.concurrent.*;

/**
 * 用synchronized修饰方法可以把整个方法变成同步代码块,synchronized方法加锁对象是this;
 *
 * 通过合理的设计和数据封装可以让一个类编程"线程安全";
 *
 * 一个类没有特殊说明,默认不是线程安全的;
 *
 * 多线程能否安全访问某个非线程安全的实例,需要具体问题具体分析
 *
 * @author XiongWei
 * @date 2021/1/13
 */
public class SynchronizeMethod {

    public static void main(String[] args) {
        var c1 = new safeCounter();
        var c2 = new safeCounter();
        new Thread(() -> {
            c1.add(1);
        }).start();
        new Thread(() -> {
            c1.dec(1);
        }).start();

        new Thread(() -> {
            c2.add(1);
        }).start();
        new Thread(() -> {
            c2.dec(1);
        }).start();

        System.out.println(c1.get());
        System.out.println(c2.get());
    }
}

class safeCounter {
    private int count = 0;

    public void add(int n) {
        synchronized (this) {
            count += n;
        }
    }

    public void dec(int n) {
        synchronized(this) {
            count -= n;
        }
    }

    public int get() {
        return count;
    }
}